package battleco

import (
	"wails/schema/config/commonco"
	"wails/schema/enums/battleenum"
)

// C技能
// @schema_export --ident=schema --json --config=技能
// @schema_go
// @cache_ts
// @alias 技能
type C技能 struct {
	// @alias 名称
	M名称 string
	// @alias 描述
	M描述 string
	// @alias 图标
	T图标 string `link:"图标"`
	// @alias 扩展属性
	K扩展属性 map[string]interface{} `_type:"扩展属性"`
	// @alias 类别
	L类别 battleenum.J技能类别
	// @alias 标旗
	B标旗 map[battleenum.J技能标旗]bool
	// @alias 激活效果
	// 当该行为被开启时所发生的效果
	C启用效果 string `link:"效果"`
	// @alias 禁用效果
	// 当该行为被禁用时所发生的效果
	J禁用效果 string `link:"效果"`
	// todo: 定位
	// @alias 定位
	D定位 battleenum.J技能定位
	// @alias 定位
	S时间线 string
	// 该技能的费用参数。
	// @alias 消耗
	X消耗 *S消耗
	// @alias 响应集
	X响应集 map[string]string `link:"响应"`
	// 获得技能后, 同时获得的行为
	// @alias 行为集
	X行为集 map[string]string `link:"行为"`
	// 默认为10000
	// @alias 智能优先级
	Z智能优先级 int

	// 目标在【智能范围】之外时，会先靠近目标，到达【效果范围】内，执行【效果】
	// 如果【效果范围】等于0，表示不限制范围
	// @alias 智能范围
	Z智能范围 float64
}

// 配置-技能-行为
// 让单位可以开关行为
// 演算体事件 [[battleenum.ActorSubAbil]]
// ```
// TargetOn: 开启行为的时候触发
// TargetOff: 关闭行为的时候触发
// ```
// @schema_export --ident=schema --json --config=技能
// @schema_go
// @cache_ts
// @alias 技能_行为
type C技能_行为 struct {
	C技能

	// @alias 行为标旗
	// 该技能的标旗
	B行为标旗 map[battleenum.E技能行为标旗]bool

	// @alias 行为
	// 从施法者身上添加或移除技能的行为。
	X行为 string `link:"行为"`

	// 技能的费用参数
	// @alias 关闭消耗
	G关闭消耗 *S消耗

	// @alias 验证器
	// 执行该技能的验证器
	Y验证器 map[string]string `link:"验证器"`

	// 允许技能后，获得的战术，配置如何释放该技能
	// @alias 战术集
	Z战术集 map[string]string `link:"战术"`

	// @alias 开启效果
	// 当该行为被开启时所发生的效果
	C开启效果 string `link:"效果"`

	// @alias 关闭效果
	// 当该行为被禁用时所发生的效果
	J关闭效果 string `link:"效果"`
}

// C技能_效果
// 在目标单位/点施放效果, 是即时效果和目标效果的父类
// 演算体事件 [[battleenum.ActorSubAbil]]
// ```
// SourceApproachStart -> SourceApproachStop -> SourcePrepStart -> SourcePrepStop -> SourceCastStart -> SourceCastStop -> SourceChannelStart -> SourceChannelStop -> SourceFinishStart -> SourceFinishStop
// TargetApproachStart -> TargetApproachStop -> TargetPrepStart -> TargetPrepStop -> TargetCastStart -> TargetCastStop -> TargetChannelStart -> TargetChannelStop -> TargetFinishStart -> SourceFinishStop
// SourceWaitStart -> SourceWaitStop: 等待阶段触发
// TargetWaitStart -> TargetWaitStop: 等待阶段触发
// SourceBailStart -> SourceBailStop: 担保阶段触发
// TargetBailStart -> TargetBailStop: 担保阶段触发
// ```
// @schema_export --ident=schema --json --config=技能
// @schema_go
// @cache_ts
// @alias 技能_效果
type C技能_效果 struct {
	C技能

	// @alias 施法类型
	S施法类型 battleenum.J技能施法类型

	// 技能标旗。
	// @alias 效果标旗
	M效果标旗 map[battleenum.J技能效果标旗]bool

	// @alias 指令操作
	Z指令操作 battleenum.J技能指令操作

	// @alias 指令目标
	Z指令目标 battleenum.J技能指令目标

	// todo:被命令行动代替?
	// @alias 指令目标
	M指令目标 battleenum.Z指令目标

	// @alias 可取消阶段
	// 该效果可被取消的阶段。
	K可取消阶段 map[battleenum.J技能阶段]bool

	// @alias 取消消耗
	Q取消消耗 *S消耗

	// @alias 错误警示信息
	// 如果该技能不能施放则会发生的警示信息。
	C错误警示信息 string

	// @alias  移动器
	// 接近目标时使用的移动器
	Y移动器 string

	// 与目标的距离达到时，使用移动器时
	// @alias 移动器触发范围
	Y移动器触发范围 float64

	// @alias 占位单位
	// 该技能的幽灵放置图片
	Z占位单位 string

	// @alias 阶段时间
	J阶段时间 map[battleenum.J技能阶段]float64

	// @alias 阶段效果
	// 该技能的效果
	J阶段效果 map[battleenum.J技能阶段]string `link:"效果"`

	// @alias 可暂停阶段
	K可暂停阶段 map[battleenum.J技能阶段]bool

	// @alias 可抢占阶段
	K可抢占阶段 map[battleenum.J技能阶段]bool

	// @alias 可返还阶段
	K可返还阶段 map[battleenum.J技能阶段]bool
	// @alias 不可打断的
	// 该技能无法被打断的阶段。
	B不可打断阶段 map[battleenum.J技能阶段]bool
	// @alias 显示进程
	// 技能的阶段,即为施法者显示的一个进度条 。
	X显示进程 map[battleenum.J技能阶段]bool

	// 技能的施法范围, 0-表示不限
	// @alias 施法范围
	S施法范围 *commonco.ValueRange

	// @alias 距离模式
	RangeMode battleenum.F范围模式

	// @alias 额外范围
	// 在施法被取消之前,目标单位可以远离一开始被瞄准的位置点多远的距离。
	RangeSlop float64

	// @alias 返还系数
	// 技能被取消时，将会返回的消耗系数。
	F返还系数 *S消耗系数

	// 该技能可作用的目标单位类型
	// @alias 目标过滤器
	M目标过滤器 *S目标过滤器

	// @alias 目标排序
	// 定义该技能如何优先选择潜在的目标。
	M目标排序 map[string]string `link:"目标排序"`

	// @alias 标记已使用
	UseMarkerArray []bool

	// @alias 验证器
	// 执行该技能的验证器
	Y验证器 map[string]string `link:"验证器"`

	// 重复执行当前技能时，会按照触发次数执行另一个技能
	// @alias 重复技能信息
	C重复技能信息 map[string]*S重复技能信息

	// 按照顺序执行技能
	// @alias 连续技能信息
	L连续技能信息 map[string]*S连续技能信息

	// 允许技能后，获得的战术，配置如何释放该技能
	// @alias 战术集
	Z战术集 map[string]string `link:"战术"`

	// @alias 修改属性
	X修改属性 map[string]*commonco.X修正公式_属性

	// @alias 创建表现
	C创建表现 map[string]*S技能效果表现
}

type S技能效果表现 struct {
	// @alias 创建时机
	C创建时机 battleenum.J技能创建时机

	// 通常用于创建的表现需要再某时机销毁时
	// @alias 销毁时机
	X销毁时机 battleenum.J技能销毁时机

	// @alias 被动持续
	B被动持续 bool

	// @alias 表现
	B表现 string `link:"表现"`
}

type S连续技能信息 struct {
	// @alias 技能
	J技能 string `link:"技能"`
	// @alias 几率
	J几率 float64
}

type S重复技能信息 struct {
	// @alias 技能
	J技能 string `link:"技能"`
	// 超过【过期时长】后，中断连续技能
	// @alias 过期时长
	G过期时长 float64
}
